有一次,有人反應說用軟體Toad來建立一個新的table時,執行時間非常的久,過了15分鐘還沒有完成。
之前沒有遇過新建表格需要這麼久的時間,所以跟他要了一下SQL。
新建Table的SQL大致如下:
create table temp_01_200 as (
select we.WIP_ENTITY_NAME,msi.SEGMENT1 item_no,msi.DESCRIPTION,wdj.SCHEDULED_COMPLETION_DATE start_date,
wdj.START_QUANTITY,wdj.QUANTITY_COMPLETED qty
from wip_discrete_jobs wdj,
mtl_system_items msi,
wip_entities we,
WIP_OPERATIONS_V wo,
...(略)
由上述的SQL可以得知,它有一個Select的語法,要抓取資料到新的表格內。
所以單獨執行Select的SQL語法,但是執行的速度很快,而抓出來的資料筆數只有200筆。
所以我重新執行一次Create Table,並找出它的執行計畫,發現Buffer Sort有Full Scan Table的情況
因為SQL有串一個WIP_OPERATIONS_V,所以檢查一下WIP_OPERATIONS_V的SQL語法,發現這個View有使用order by語法。
... (略)
FROM BOM_DEPARTMENTS BD,
BOM_STANDARD_OPERATIONS BSO,
WIP_OPERATIONS WO,
MFG_LOOKUPS LU1
WHERE BD.DEPARTMENT_ID = WO.DEPARTMENT_ID
AND BSO.STANDARD_OPERATION_ID(+) = WO.STANDARD_OPERATION_ID
AND NVL (BSO.OPERATION_TYPE, 1) = 1
AND BSO.LINE_ID IS NULL
AND LU1.LOOKUP_TYPE(+) = 'BOM_EAM_SHUTDOWN_TYPE'
AND LU1.LOOKUP_CODE(+) = WO.SHUTDOWN_TYPE
ORDER BY WO.OPERATION_SEQ_NUM;
因為新建的表格不需要order by,於是改寫Create Table語法,直接以實體table取代View,並將order by刪掉,重新執行Create Table很快就完成了。
我們的Oracle DB是CBO優化器,也有定期執行Table的統計值(Statistic)收集,但是有時候還是會有這樣的情形出現,之前類似的情況發生時,有時我們會加hint來強制變更執行計劃。